package org.testory.common;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.testory.common.Matchers.asMatcher;
import static org.testory.common.Matchers.isMatcher;
import static org.testory.testing.Fakes.newObject;
import org.junit.Before;
import org.junit.Test;
public class TestMatchersAsMatcher {
private Object matcher, object, otherObject;
private String string;
@Before
public void before() {
matcher = newObject("matcher");
object = newObject("object");
otherObject = newObject("otherObject");
string = "string";
}
@Test
public void supports_hamcrest_matcher() {
matcher = new org.hamcrest.Matcher<Object>() {
public boolean matches(Object item) {
return item == object;
}
public void describeTo(org.hamcrest.Description description) {}
public void describeMismatch(Object item, org.hamcrest.Description mismatchDescription) {}
@Deprecated
public void _dont_implement_Matcher___instead_extend_BaseMatcher_() {}
};
assertTrue(isMatcher(matcher));
assertTrue(asMatcher(matcher).matches(object));
assertFalse(asMatcher(matcher).matches(otherObject));
}
@Test
public void supports_hamcrest_diagnosis() {
matcher = new org.hamcrest.Matcher<Object>() {
public boolean matches(Object item) {
return false;
}
public void describeTo(org.hamcrest.Description description) {}
public void describeMismatch(Object item, org.hamcrest.Description mismatchDescription) {
mismatchDescription.appendText(string).appendText(item.toString());
}
@Deprecated
public void _dont_implement_Matcher___instead_extend_BaseMatcher_() {}
};
assertEquals(string + object, ((DiagnosticMatcher) asMatcher(matcher)).diagnose(object));
}
@Test
public void supports_fest_matcher() {
matcher = new org.fest.assertions.Condition<Object>() {
public boolean matches(Object value) {
return value == object;
}
};
assertTrue(isMatcher(matcher));
assertTrue(asMatcher(matcher).matches(object));
assertFalse(asMatcher(matcher).matches(otherObject));
}
@Test
public void supports_fest_2_matcher() {
matcher = new org.fest.assertions.core.Condition<Object>() {
public boolean matches(Object value) {
return value == object;
}
};
assertTrue(isMatcher(matcher));
assertTrue(asMatcher(matcher).matches(object));
assertFalse(asMatcher(matcher).matches(otherObject));
}
@Test
public void supports_assertj_matcher() {
matcher = new org.assertj.core.api.Condition<Object>() {
public boolean matches(Object value) {
return value == object;
}
};
assertTrue(isMatcher(matcher));
assertTrue(asMatcher(matcher).matches(object));
assertFalse(asMatcher(matcher).matches(otherObject));
}
@Test
public void supports_guava_predicate() {
matcher = new com.google.common.base.Predicate<Object>() {
public boolean apply(Object input) {
return input == object;
}
};
assertTrue(isMatcher(matcher));
assertTrue(asMatcher(matcher).matches(object));
assertFalse(asMatcher(matcher).matches(otherObject));
}
@Test
public void supports_guava_function() {
matcher = new com.google.common.base.Function<Object, Boolean>() {
public Boolean apply(Object input) {
return input == object;
}
};
assertTrue(isMatcher(matcher));
assertTrue(asMatcher(matcher).matches(object));
assertFalse(asMatcher(matcher).matches(otherObject));
}
@Test
public void supports_matches_method() {
matcher = new Object() {
@SuppressWarnings("unused")
public boolean matches(Object item) {
return item == object;
}
};
assertTrue(isMatcher(matcher));
assertTrue(asMatcher(matcher).matches(object));
assertFalse(asMatcher(matcher).matches(otherObject));
}
@Test
public void supports_apply_method() {
matcher = new Object() {
@SuppressWarnings("unused")
public boolean apply(Object item) {
return item == object;
}
};
assertTrue(isMatcher(matcher));
assertTrue(asMatcher(matcher).matches(object));
assertFalse(asMatcher(matcher).matches(otherObject));
}
@Test
public void requires_method() {
assertFalse(isMatcher(new Object() {}));
}
@Test
public void requires_correct_name() {
assertFalse(isMatcher(new Object() {
@SuppressWarnings("unused")
public boolean wrongName(Object item) {
return false;
}
}));
}
@Test
public void requires_boolean_return_type() {
assertFalse(isMatcher(new Object() {
@SuppressWarnings("unused")
public void matches(Object item) {}
}));
assertFalse(isMatcher(new Object() {
@SuppressWarnings("unused")
public Object matches(Object item) {
return null;
}
}));
}
@Test
public void requires_object_parameter() {
assertFalse(isMatcher(new Object() {
@SuppressWarnings("unused")
public boolean matches(String item) {
return false;
}
}));
assertFalse(isMatcher(new Object() {
@SuppressWarnings("unused")
public boolean matches() {
return false;
}
}));
}
@Test
public void requires_public_method() {
assertFalse(isMatcher(new Object() {
@SuppressWarnings("unused")
boolean matches(Object item) {
return false;
}
}));
assertFalse(isMatcher(new Object() {
@SuppressWarnings("unused")
protected boolean matches(Object item) {
return false;
}
}));
assertFalse(isMatcher(new Object() {
@SuppressWarnings("unused")
private boolean matches(Object item) {
return false;
}
}));
}
@Test
public void requires_no_checked_exceptions() {
assertFalse(isMatcher(new Object() {
@SuppressWarnings("unused")
public boolean matches(Object item) throws Exception {
return false;
}
}));
assertFalse(isMatcher(new Object() {
@SuppressWarnings("unused")
public boolean matches(Object item) throws Throwable {
return false;
}
}));
}
@Test
public void delegates_to_string() {
matcher = new Object() {
@SuppressWarnings("unused")
public boolean matches(Object item) {
return false;
}
public String toString() {
return string;
}
};
assertEquals(matcher.toString(), asMatcher(matcher).toString());
}
@Test
public void object_cannot_be_matcher() {
assertFalse(isMatcher(object));
try {
asMatcher(object);
fail();
} catch (IllegalArgumentException e) {}
}
@Test
public void null_cannot_be_matcher() {
try {
isMatcher(null);
fail();
} catch (NullPointerException e) {}
try {
asMatcher(null);
fail();
} catch (NullPointerException e) {}
}
}